Jackson-এর @JsonTypeInfo এবং @JsonSubTypes অ্যানোটেশন ব্যবহার করে আপনি JSON ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার সময় পলিমরফিক টাইপ হ্যান্ডল করতে পারেন। এটি বিশেষভাবে দরকার হয় যখন আপনার একটি প্যারেন্ট ক্লাস এবং একাধিক সাবক্লাস থাকে এবং JSON ডেটা থেকে সঠিক সাবক্লাসে ডেসিরিয়ালাইজ করার প্রয়োজন হয়।
@JsonTypeInfo
@JsonTypeInfo প্যারেন্ট ক্লাসে ব্যবহৃত হয় এবং JSON ডেটার মধ্যে টাইপ সম্পর্কিত তথ্য সংরক্ষণ করে। এটি পলিমরফিজম হ্যান্ডল করার মূল অংশ।
প্যারামিটার
use: কীভাবে টাইপ সম্পর্কিত তথ্য উল্লেখ করা হবে। উদাহরণ:JsonTypeInfo.Id.CLASSবাJsonTypeInfo.Id.NAME.include: টাইপ সম্পর্কিত তথ্য JSON-এ কোথায় অন্তর্ভুক্ত হবে। উদাহরণ:JsonTypeInfo.As.PROPERTY.property: JSON ডেটায় টাইপের জন্য ব্যবহৃত প্রপার্টি নাম। উদাহরণ:"type".defaultImpl: কোনো টাইপ না পাওয়া গেলে ডিফল্ট ক্লাস ব্যবহার।
@JsonSubTypes
@JsonSubTypes ব্যবহার করে প্যারেন্ট ক্লাসের বিভিন্ন সাবক্লাসের তথ্য প্রদান করা হয়। এতে টাইপ এবং সংশ্লিষ্ট ক্লাস ম্যাপিং করা হয়।
প্যারামিটার
value: একাধিক@JsonSubTypes.Typeযা টাইপ এবং ক্লাসের মধ্যে সম্পর্ক সংজ্ঞায়িত করে।
কোড উদাহরণ
ধরুন, আমাদের একটি প্যারেন্ট ক্লাস Animal এবং দুইটি সাবক্লাস Dog ও Cat রয়েছে।
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
// Parent class
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
)
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
abstract class Animal {
private String name;
// Constructors, Getters, and Setters
public Animal() {}
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// Subclass 1
class Dog extends Animal {
private String breed;
public Dog() {}
public Dog(String name, String breed) {
super(name);
this.breed = breed;
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
@Override
public String toString() {
return "Dog{name='" + getName() + "', breed='" + breed + "'}";
}
}
// Subclass 2
class Cat extends Animal {
private boolean indoor;
public Cat() {}
public Cat(String name, boolean indoor) {
super(name);
this.indoor = indoor;
}
public boolean isIndoor() {
return indoor;
}
public void setIndoor(boolean indoor) {
this.indoor = indoor;
}
@Override
public String toString() {
return "Cat{name='" + getName() + "', indoor=" + indoor + "}";
}
}
Serialization এবং Deserialization
JSON ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার জন্য ObjectMapper ব্যবহার করা হবে।
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTypeInfoExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Serialize
Animal dog = new Dog("Buddy", "Golden Retriever");
Animal cat = new Cat("Whiskers", true);
String dogJson = objectMapper.writeValueAsString(dog);
String catJson = objectMapper.writeValueAsString(cat);
System.out.println("Serialized Dog JSON: " + dogJson);
System.out.println("Serialized Cat JSON: " + catJson);
// Deserialize
Animal deserializedDog = objectMapper.readValue(dogJson, Animal.class);
Animal deserializedCat = objectMapper.readValue(catJson, Animal.class);
System.out.println("Deserialized Dog Object: " + deserializedDog);
System.out.println("Deserialized Cat Object: " + deserializedCat);
}
}
Output
Serialized JSON
Serialized Dog JSON: {"type":"dog","name":"Buddy","breed":"Golden Retriever"}
Serialized Cat JSON: {"type":"cat","name":"Whiskers","indoor":true}
Deserialized Objects
Deserialized Dog Object: Dog{name='Buddy', breed='Golden Retriever'}
Deserialized Cat Object: Cat{name='Whiskers', indoor=true}
কীভাবে কাজ করে?
- Serialization:
@JsonTypeInfoঅ্যানোটেশনের মাধ্যমেtypeফিল্ডটি JSON-এ যোগ করা হয়, যা টাইপ নির্দেশ করে। - Deserialization:
@JsonSubTypesএর মাধ্যমে টাইপ এবং সাবক্লাসের মধ্যে সম্পর্ক সংজ্ঞায়িত করা হয়। টাইপ ফিল্ডের ভিত্তিতে সঠিক সাবক্লাস তৈরি হয়।
ব্যবহার ক্ষেত্র
- Polymorphism Handling: একাধিক সাবক্লাসের সাথে JSON ডেটা হ্যান্ডলিং।
- Dynamic Type Mapping: JSON-এ টাইপ ফিল্ডের উপর ভিত্তি করে সঠিক সাবক্লাস নির্বাচন।
- REST API: API এর মাধ্যমে পলিমরফিক ডেটা আদান-প্রদান।
@JsonTypeInfo এবং @JsonSubTypes ব্যবহার করে পলিমরফিক JSON ডেটার প্রক্রিয়াকরণ সহজ এবং কার্যকর করা যায়। এটি বিশেষভাবে দরকার হয় যখন একাধিক সাবক্লাস এবং পলিমরফিক আচরণ পরিচালনা করতে হয়।
Read more